//
// Created by hi on 24-11-19.
//pointer指针
/*
 * 指针就是这个变量的内存地址
 * 指针运算就是就是以这个变量的类型当做步长运算
 * 数组类型的指针获取的是最后一个元素的地址
 * 野指针,一个不受控制的指针,比如一个数组里10个元素,把数组第0个元素的地址加15,运算的值超过了这个数组的数量最大值,获得的这个地址就是野指针,是无意义的指针
 * 悬空指针,指针的里的数据被垃圾回收了,这个指针就是悬空指针,比如局部变量的指针在外部使用就是悬空指针
 */
#include <stdio.h>
void change(int *a) {
    *a = *a + 1;
}
int * fun() {
    int a = 2;
    int *p = &a;

    return p;
}
int main() {
    //创建指针变量
    int* p;
    //声明一个变量
    int a = 10;
    //将这个变量的指针地址存到指针变量里
    p = &a;
    //打印指针变量
    printf("指针是:%p\n", p);
    //解析指针变量中的数据
    printf("使用指针解析出来的变量值是:%d\n", *p);

    change(&a);
    printf("使用指针直接更改变量的值:%d\n", a);

    int *point = p+1;
    printf("运算后的指针:%p\n", point);
    int arr[] = {1, 2, 3, 4, 5, 6, 7, 8, 9, 10};
    printf("获取数组元素个数%zu\n",sizeof(arr) / sizeof(arr[0]));

    printf("野指针%p\n",&arr[9] + 10);
    //创建悬空指针,在函数中已经被销毁的指针
    int *yp = fun();
    printf("悬空指针%p\n",yp);
    //垃圾回收有滞后可能值还是原来的值
    printf("打印悬空指针的值:%d\n",*yp);
}
